import java.sql.*;
import java.util.Date;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.DepthTest;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.Popup;

/**
 *
 * @author enrico
 */
public class ModificaLibroController {

  ModificaLibroView mlv = new ModificaLibroView(this);
  TextField codiceField = new TextField();
  TextField giorniField = new TextField();
  Label persona = new Label("Inserisci il codice persona.");
  Biblioteca controller;
  Popup elencoUtenti;
  int codicePersona,codiceLibro,sezioneLibro;
  Button presta = new Button("Presta");
  boolean prestaNome=false;
  boolean prestaGiorni=false;

  public ModificaLibroController(Biblioteca controller) {
    this.controller = controller;
  }

  public ModificaLibroView getView() {
    return mlv;
  }

  public void setLibroData(String sezione, String titolo, String sottotitolo,
          String autore, String editore, String anno, String sc, String prsc, String pr, String und, String quantita, String id, boolean prestato, boolean rimuovibile) {
    if (mlv.getModificheNonSalvate() == true) {
      controller.showAlert("Ci sono modifiche non salvate, vuoi salvarle prima di cambiare libro?");
    } else {
      mlv.setLibroData(sezione, titolo, sottotitolo, autore, editore, anno, sc, prsc, pr, und, quantita, id, prestato,rimuovibile);
      
      try {
      Class.forName("org.sqlite.JDBC");
      Connection conn = DriverManager.getConnection("jdbc:sqlite:lib/biblioteche.db");
      //Statement stat = conn.createStatement();

      PreparedStatement pstmt = conn.prepareStatement("SELECT nome,cognome,data,dataRientro,rientrato FROM prestiti LEFT JOIN biblioteche ON ID_libro=biblioteche.ID LEFT JOIN anagrafica ON ID_persona=anagrafica.ID WHERE ID_libro="+id+" ORDER BY data DESC");
      ResultSet rs = pstmt.executeQuery();
      
      ObservableList ol = FXCollections.observableArrayList();
      
      while (rs.next()) {
        String stringa = rs.getString("nome")+" "+rs.getString("cognome");
        String[] data = rs.getString("data").split("-");
        if (rs.getInt("rientrato")==0) stringa = stringa.concat(" (prestato il "+data[2]+"/"+data[1]+"/"+data[0]+")");
        else {
          String[] dataRientro = rs.getString("dataRientro").split("-");
          stringa = stringa.concat(" ("+data[2]+"/"+data[1]+"/"+data[0]+" - "+dataRientro[2]+"/"+dataRientro[1]+"/"+dataRientro[0]+" )");
        }
        ol.add(stringa);
      }
      
      rs.close();
      pstmt.close();
      conn.close();
      
      mlv.getListaPrestiti().setItems(ol);
      } catch (Exception e) {
        System.out.println(e.getMessage());
      }
    }
  }

  public void alertSurpassed(boolean risposta) {
    // Ci sono modifiche non salvate, vuoi salvarle prima di cambiare libro?
    if (risposta) {
      mlv.salvaModifiche();
      mlv.setModificheNonSalvate(false);
    }
    mlv.setModificheNonSalvate(false);
  }

  void removeLibro(int sezioneNumero, int id) {
    // query
    try {
      Class.forName("org.sqlite.JDBC");
      Connection conn = DriverManager.getConnection("jdbc:sqlite:lib/biblioteche.db");
      //Statement stat = conn.createStatement();

      PreparedStatement pstmt = conn.prepareStatement("UPDATE biblioteche SET rimosso=1 WHERE ID=" + String.valueOf(id));
      //System.out.println("DELETE FROM biblioteche WHERE ID="+String.valueOf(id));
      pstmt.executeUpdate();

      conn.close();

      controller.getListaController().refreshTable(sezioneNumero);
    } catch (Exception e) {
    }
  }

  public void salvaModifiche(String id, String titolo, String sottotitolo, String autore, String editore, String anno, String sc, String prsc, String pr, String und, String quantita, String sezione, int sezioneAttuale) {
    try {
      Class.forName("org.sqlite.JDBC");
      Connection conn = DriverManager.getConnection("jdbc:sqlite:lib/biblioteche.db");
      //Statement stat = conn.createStatement();

      PreparedStatement pstmt = conn.prepareStatement("UPDATE biblioteche SET PR=?, Quanti=?, SC=?, PRSC=?, Titolo=?, Sottotitolo=?, Autore=?, Editore=?, Anno=?, Und=?, Sezione=? WHERE ID=?");

      pstmt.setString(1, pr);
      pstmt.setString(2, quantita);
      pstmt.setString(3, sc);
      pstmt.setString(4, prsc);
      pstmt.setString(5, titolo);
      pstmt.setString(6, sottotitolo);
      pstmt.setString(7, autore);
      pstmt.setString(8, editore);
      pstmt.setString(9, anno);
      pstmt.setString(10, und);
      pstmt.setString(11, sezione);
      pstmt.setString(12, id);

      pstmt.executeUpdate();
      conn.close();
      pstmt.close();
    } catch (Exception e) {
      System.out.println(e.getMessage());

    }
    LibroModel lmn = new LibroModel(id, pr, sc, prsc, quantita, titolo, sottotitolo, autore, editore, anno, und, sezione, "-");
    controller.getListaController().subsituteModel(lmn,sezione);
    //controller.getListaController().refreshTable(Integer.valueOf(sezione), sezioneAttuale);
    mlv.setModificheNonSalvate(false);
  }

  void prestaLibro(int id, int sezione) {
    codiceLibro=id;
    sezioneLibro = sezione;
    elencoUtenti = new Popup();
    elencoUtenti.setHideOnEscape(false);
    elencoUtenti.setAutoFix(true);
    elencoUtenti.setAutoHide(false);

    HBox personaelista = new HBox();
    HBox dataegiorni = new HBox();
    GridPane boxFields = new GridPane();
    boxFields.setVgap(10);
    boxFields.setVgap(10);
    boxFields.setPadding(new Insets(10, 10, 10, 10));
    
    boxFields.setId("aggiungiGrid");

    Text codice = new Text("Codice");
    codice.setStyle("-fx-font-weight: bold");
    Text giorniLabel = new Text("Durata");
    giorniLabel.setStyle("-fx-font-weight: bold");
    
    presta.setOnAction(new EventHandler<ActionEvent>() {

      @Override
      public void handle(ActionEvent arg0) {
        segnaLibroComePrestato();
        elencoUtenti.hide();
        controller.getRoot().setDisable(false);
      }

    });

    codiceField.setPrefWidth(40);
    giorniField.setPrefWidth(40);
    codiceField.setMaxHeight(25);
    giorniField.setMaxHeight(25);
    codiceField.setOnKeyReleased(new EventHandler<KeyEvent>() {

      @Override
      public void handle(KeyEvent arg0) {
        cercaCodice(codiceField.getText());
      }
    });
    giorniField.setOnKeyReleased(new EventHandler<KeyEvent>() {

      @Override
      public void handle(KeyEvent arg0) {
        if ((giorniField.getText().matches("[0-9]+") && giorniField.getText()!="") && Integer.valueOf(giorniField.getText())>0) prestaGiorni = true;
        else prestaGiorni = false;
        
        checkPrestitoButton();
      }
      
    });

    persona.setPrefWidth(200);
    
    presta.setDisable(true);
    //personaelista.setStyle("-fx-alignment: center; -fx-spacing: 10");
    //boxFields.setStyle("-fx-alignment: center; -fx-spacing: 10");

    //personaelista.getChildren().addAll(new ImageView(new Image(getClass().getResourceAsStream("Stili/User.png"))), codice, codiceField, persona, presta);
    //dataegiorni.getChildren().addAll(giorniLabel, giorniField);

    boxFields.add(new ImageView(new Image(getClass().getResourceAsStream("Stili/User.png"))),0,0);
    boxFields.add(codice,1,0);
    boxFields.add(codiceField,2,0);
    boxFields.add(persona,3,0);
    boxFields.add(presta,4,0);
    boxFields.add(giorniLabel,1,1);
    boxFields.add(giorniField,2,1);
    
    //boxFields.getChildren().addAll(personaelista,dataegiorni);
    elencoUtenti.getContent().add(boxFields);

    elencoUtenti.show(controller.getScene().getWindow());
    controller.getRoot().setDisable(true);
  }

  private void cercaCodice(String code) {
    try {
      int codice = Integer.valueOf(code.trim());
      Class.forName("org.sqlite.JDBC");
      Connection conn = DriverManager.getConnection("jdbc:sqlite:lib/biblioteche.db");
      //Statement stat = conn.createStatement();

      PreparedStatement pstmt = conn.prepareStatement("SELECT nome,cognome FROM anagrafica WHERE ID=" + codice);
      ResultSet rs = pstmt.executeQuery();
      
      persona.setText(rs.getString("nome")+" "+rs.getString("cognome"));
      codicePersona = codice;
      prestaNome = true;
      conn.close();
      pstmt.close();

    } catch (Exception e) {
      System.out.println(e.getMessage());
      
      persona.setText("Inserisci il codice persona.");
      prestaNome = false;
    }
    checkPrestitoButton();
  }
  
  private void segnaLibroComePrestato() {
    try {
      Class.forName("org.sqlite.JDBC");
      Connection conn = DriverManager.getConnection("jdbc:sqlite:lib/biblioteche.db");

      PreparedStatement pstmt = conn.prepareStatement("INSERT INTO prestiti ('ID_libro','ID_persona','data','rientrato','dataRientro','durata') VALUES (?,?,?,0,'',?)");
      
      Calendar cal = Calendar.getInstance();
      String data = String.valueOf(cal.get(Calendar.YEAR))+ "-" +String.valueOf(cal.get(Calendar.MONTH)+1)+ "-" +String.valueOf(cal.get(Calendar.DAY_OF_MONTH));
      
      int giorniPrestito = Integer.valueOf(giorniField.getText());
      pstmt.setString(3,data); // 2012-12-30
      pstmt.setInt(1, codiceLibro);
      pstmt.setInt(2, codicePersona);
      pstmt.setInt(4, giorniPrestito);
      
      controller.setNuovoPrestito(codiceLibro,codicePersona,data,giorniPrestito,sezioneLibro);
      
      pstmt.executeUpdate();
      pstmt.close();
      conn.close();
    } catch (Exception e) {
      System.out.println(e.getMessage());
    }
  }

  private void checkPrestitoButton() {
    if (prestaGiorni == true && prestaNome == true) presta.setDisable(false);
    else presta.setDisable(true);
  }
}
